import bean.Student;
import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

/**
 * 1.异常：指的是程序在执行过程中，出现的非正常情况，如果不处理就会导致JVM的非正常进行。
 * <p>
 * 2.异常的抛出机制
 * - Java中把不同的异常用不同的类表示，一旦发生某种异常，就创建该异常类型的对象，并且抛出(throw)。
 * - 然后程序员可以捕获(catch)到这个异常对象，并处理；
 * - 如果没有捕获(catch)这个异常对象，那么这个异常对象将会导致程序终止。
 * <p>
 * 3.Java异常体系
 * -Throwable 'java.lang.Throwable' 类是Java程序执行过程中发生的异常事件对应的类和根父类。
 * -Throwable中的常用方法：
 * --> public void printStackTrace(): 打印异常的详细信息。
 * --> public String getMessage(): 获取发生异常的原因。
 * -两个子类 Error Exception
 * <p>
 * 4.Error
 * - Java虚拟机无法解决的严重问题。
 * <p>
 * 5.Exception
 * - 其它因编程错误或偶然的外在因素导致的一般性问题，需要使用针对性的代码进行处理，使程序继续运行。
 * - 否则一旦发生某种异常，程序也会挂掉。
 * （一）编译时异常 checked异常
 * -----一定要处理。否则编译不通过。
 * （二）运行时异常 runtime异常
 * -----对于运行时异常，开发中通常不进行显式处理。
 * -----一旦在程序执行中，出现了运行时异常，那么就根据异常的提示信息修改代码即可。
 * <p>
 * 6.异常的处理方式
 * <p>
 * > 方式 1：抓抛模型  try-catch-finally
 * <p>
 * ---① “抛” 程序在执行过程中，一旦出现异常，就会在出现异常的代码处，生成异常类的对象，并将此对象抛出。
 * ----------一旦抛出，此程序就不执行其后的代码了。
 * ---② “抓” 针对①中抛出的异常，进行捕获处理。此捕获处理的过程，就称为抓。
 * ----------一旦将异常处理了，代码就可以继续执行。
 * > 基本结构
 * try{
 * ...... // 可能产生异常的代码
 * ...... // try中声明的变量，出了try结构之后，就不能调用了。
 * } catch(异常类型1 e){
 * ...... // 当产生异常类型1时的处理措施
 * }catch(异常类型2 e){
 * ...... // 当产生异常类型2时的处理措施
 * }finally{
 * ...... // 无论是否发生异常，都无条件执行的语句
 * ...... // 无论try中或catch中是否存在仍未被处理的异常，无论try或catch中是否存在return语句等，
 * ...... // finally中声明的语句都一定要被执行。
 * }
 * <p>
 * > 方式 2：在方法的声明处，使用 "throws 异常类型1, 异常类型2, ..."
 * <p>
 * <p>
 * 如何理解 “自动 vs 手动 ” 抛出异常对象？
 * -过程1：“抛”：
 * ---自动抛：程序执行过程中，一旦出现异常，就会在出现异常的代码处，自动生成对应异常类的对象，并将此对象抛出。
 * ---手动抛：程序在执行过程中，不满足指定条件的情况下，主动使用"throw + 异常类对象"方式抛出异常对象。
 * -过程2：“抓”：
 * ---狭义上，try-catch-finally的方式捕获异常，并处理。
 * ---广义上，把“抓”理解为“处理”。则此时对应着异常处理的两种方式：① try-catch-finally ② throws
 * <p>
 * throw后的代码不能被执行，编译不通过。
 * <p>
 * 如果自定义异常类是非运行时异常，则必须考虑如何处理此异常类的对象
 *
 * 自定义异常类：
 * 1.继承于现有的异常体系。通常继承于RuntimeException/Exception
 * 2.通常提供几个重载的构造器。
 * 3.提供一个全局常量，声明为:static final long serialVersionUID = ...;
 */
public class ExceptionTest {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i = 0;   // 输入 'a'   InputMismatchException
        try {
            i = scan.nextInt();
            System.out.println(i);
        } catch (Exception e) {
            System.out.println("出现了InputMismatchException异常");
        } finally {
            System.out.println();
        }
    }

    @Test
    public void test1() {
        int[] arr = new int[3];
//        System.out.println(arr[3]); //ArrayIndexOutOfBoundsException

//        arr=null;
//        System.out.println(arr[1]); // NullPointerException

//        int a = Integer.parseInt("a"); //NumberFormatException

//        int a = 3/0;  //ArithmeticException
    }

    @Test
    public void test2() {
//        Object o =12;
//        Date date=(Date) o; //ClassCastException
    }


    @Test
    public void testCheckedException() {
        // 编译时异常
//        Class clz = Class.forName("java.lang.String"); // ClassNotFoundException
        FileInputStream fileInputStream = null;
        try {
            File file = new File("hello.txt");
            //可能报 FileNotFoundException
            fileInputStream = new FileInputStream(file);
            int data = 0; //可能报 IOException
            data = fileInputStream.read();
            while (data != -1) {
                System.out.println((char) data);
                data = fileInputStream.read(); //可能报 IOException
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                assert fileInputStream != null;
                fileInputStream.close(); //可能报 IOException
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

    @Test
    public void testThrow() {
        Student student = new Student();
        try {
            student.regist2(-10);
            student.regist(-10);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}
